/**
 * @file    portevent.c
 * @brief   FreeModbus事件队列移植层实现
 * @details 本文件实现了FreeModbus协议栈的事件队列机制，提供简单的事件发布和获取功能。
 *          采用单事件队列设计，适用于单线程或简单的多线程环境。事件队列用于协调
 *          协议栈内部各模块间的通信，如串口接收、定时器超时等事件的处理。
 */

#include "mb.h"             /* FreeModbus核心头文件 */
#include "mbport.h"         /* FreeModbus移植层接口头文件 */
#include "port_internal.h"  /* 内部移植层定义头文件 */

static eMBEventType eQueuedEvent;   /* 当前队列中的事件类型 */
static BOOL xEventInQueue;          /* 事件队列状态标志：TRUE=有事件，FALSE=队列为空 */

/**
 * @brief 初始化FreeModbus事件队列
 * @details 清空队列状态，准备接收事件。必须在使用其他事件函数前调用。
 * @return BOOL 初始化结果（当前实现中总是返回TRUE）
 */
BOOL xMBPortEventInit(void)
{
    /* 清空事件队列状态，标记队列为空 */
    xEventInQueue = FALSE;
    
    return TRUE;  /* 初始化总是成功 */
}

/**
 * @brief 向FreeModbus事件队列发布事件
 * @details 将事件放入队列中等待处理。单事件队列设计，新事件会覆盖旧事件。
 * @param eEvent 要发布的事件类型
 * @return BOOL 发布结果（当前实现中总是返回TRUE）
 */
BOOL xMBPortEventPost(eMBEventType eEvent)
{
    /* 标记有事件在队列中等待处理 */
    xEventInQueue = TRUE;
    
    /* 保存事件类型到队列中 */
    eQueuedEvent = eEvent;
    
    return TRUE;  /* 发布总是成功 */
}

/**
 * @brief 从 FreeModbus事件队列获取事件
 * @details 检查队列中是否有事件，有则返回事件并清空队列。非阻塞式。
 * @param eEvent 指向事件类型变量的指针，用于接收获取到的事件
 * @return BOOL 获取结果：TRUE=成功获取，FALSE=队列为空
 */
BOOL xMBPortEventGet(eMBEventType *eEvent)
{
    BOOL xEventHappened = FALSE;  /* 初始化为无事件状态 */
    
    /* 检查队列中是否有事件等待处理 */
    if(xEventInQueue)
    {
        /* 将队列中的事件复制到输出参数 */
        *eEvent = eQueuedEvent;
        
        /* 清空队列状态，标记队列为空 */
        xEventInQueue = FALSE;
        
        /* 标记成功获取到事件 */
        xEventHappened = TRUE;
    }
    
    return xEventHappened;  /* 返回是否获取到事件 */
}
